package lpca.steps 
{
	import kioschool.model.AbstractStep;
	import kioschool.view.IStepView;
	import lpca.controllers.SecondaryController;
	import lpca.controllers.LpcaController;
	import lpca.utils.Cell;
	import lpca.utils.Point;
	import lpca.view.ViewMaze;
	import lpca.view.ViewStep;
	import lpca.model.LpcaModel;	
	/**
	 * ...
	 * @author D.Shakshin
	 */
	public class TraceByStep extends LpcaAbstractStep
	{				
		private var lastPoint: Point;
		
		/**
		 * Решает шаг - выполняется в режиме демонстрации при переходе на следующий шаг
		 */
		override public function oracle():void 
		{					
			trace("oracle step: " + this.step);
			model.oracleTrace(step + 1);
			var selector: Vector.<int> = new Vector.<int>;
			selector.push(LpcaModel.checked);
			SecondaryController.instance.model.setVectorPoint(model.stackChange, selector, null, null, true);			
		}		
		
		override public function antiOracle():void
		{																		
			var point: Point = this.model.getPointOracleTrace(step + 1);
			var cell: Cell = this.model.getCell(point);
			cell.checked = false;
			this.model.setCell(this.model.getPointOracleTrace(step + 1), cell);
		}
		
		override public function restore():void
		{												
			var point: Point = this.model.getPointOracleTrace(step + 1);
			var cell: Cell = this.model.getCell(point);
			cell.checked = false;
			this.model.setCell(this.model.getPointOracleTrace(step + 1), cell);			
			this.model.clearStackChange();
		}
		
		/**
		 * Получает следующий шаг
		 */
		override public function next():AbstractStep
		{
			if ((this.step < SecondaryController.instance.model.getCountStep()-1))//если следующий шаг есть
				{														
					return new TraceByStep(this.step + 1);								
				}
			else  				
				return new FinishStep();// переход на последний этап
			return null;
		}
				
		/**
		 * Проверяет действия пользователя на данном шаге - выполняется в режиме тренировки и контроля при переходе на следующий шаг
		 */
		override public function checkInput():String 
		{	
			var correct: Boolean = model.checkTrace(step + 1);			
			if (!correct)
			{
				var selector: Vector.<int> = new Vector.<int>;
				selector.push(LpcaModel.checked);
				this.model.setVectorPoint(this.model.stackChange, selector, null, null, false);
				this.model.clearStackChange();
			}			
			return (correct)? null :"ошибка";			
		}		
		
		/**
		 * Возвращает комментарий для данного шага
		 */
		override public function get comment():String
		{			
			return "На этом шаге необходимо выбрать точку маршрута";				
		}		
		
		override public function update():void
		{		
			trace("Текущий шаг: ", this.step);
			trace("Update SaveSteps" + this.getStep());																
			SecondaryController.instance.model.clearStackChange();	
			this.model.stag = LpcaModel.stageTrace;
		}
		
		public function getStep(): int
		{
			return step;
		}
		
		public function TraceByStep(step: int) 
		{
			trace("нахождение маршрута");
			this.step = step;						
			this.model = SecondaryController.instance.model;			
		}

	}

}